/**
 * \file SSymboles.c
 * \author Catalin BLAJ
 * \author Vincent JACQUEMIN
 * \date 18 Octobre 2013
 *
 * Fichier source SSymboles.c pour le programme du Sudoku
 */


#include "SSymboles.h"

SSymboles* SS_initialiser(char* ensembleSymboles)
{
    /* Vérification des paramètres */
    assert(ensembleSymboles != '\0');

    /* Allocation mémoire et affectation des champs de structure */
    SSymboles* symboles = malloc(sizeof(SSymboles));
    symboles->ensembleSymboles = ensembleSymboles;
    symboles->type = (unsigned char) sqrt((double) strlen(ensembleSymboles));

    /* On retourne les symboles correctement allouée */
    return symboles;
}

SSymboles* SS_initialiserParType(unsigned char type)
{
    /* Vérification des paramètres */
    assert(type>=2 && type<=4);

    /* Allocation mémoire et affectation des champs de structure */
    SSymboles* symboles = malloc(sizeof(SSymboles));
    symboles->type = type;

    if (type == 2)
        symboles->ensembleSymboles = "1234";

    else if (type == 3)
        symboles->ensembleSymboles = "123456789";

    else
        symboles->ensembleSymboles = "0123456789ABCDEF";

    /* On retourne les symboles correctement alloués */
    return symboles;
}


void SS_testament(SSymboles* symboles)
{
    /* Vérification des paramètres */
    assert(symboles != NULL);

    /* On libère l'espace mémoire allouée à l'instance symboles */
    free(symboles);
}


unsigned char SS_getType(const SSymboles* symboles)
{
	/* Si le pointeur symboles est nul, on ne peut pas travailler */
    assert(symboles != NULL);

    /* On renvoit le type de Sudoku */
	return symboles->type;
}


char SS_getSymbole(const SSymboles* symboles, unsigned short indice)
{
    /* Variables de convenance */
    unsigned char type = SS_getType(symboles);
    unsigned short nombreCandidats = type*type;

	/* Si le pointeur symboles est nul, on ne peut pas travailler */
    assert(symboles != NULL);
    assert(type<nombreCandidats);

    /* On renvoit le symbole demandé */
	return symboles->ensembleSymboles[indice];
}


short SS_getIndice(const SSymboles* symboles, char caractere)
{
    /* Si le pointeur symboles est nul, on ne peut pas travailler */
    assert(symboles != NULL);

    /* On avance tant qu'on ne lit pas le caractère en paramètre */
    short position = 0;
    while ((symboles->ensembleSymboles[position] != caractere) && (symboles->ensembleSymboles[position] != '\0'))
        position++;

    if (symboles->ensembleSymboles[position] == '\0')
        return -1;

    /* On renvoit la position du caractère */
	return position;
}
